C++ 风格约定 : Parameter Names within Class Declaration
全部标签 假设您想编写一个程序来测试c++dll文件中的函数。您应该允许用户选择一个dll(我们假设我们正在谈论c++dll)。他应该能够获得dll导出的所有函数的列表。然后,用户应该能够从列表中选择一个函数名称,手动输入参数列表(参数都是基本类型,如int、double、bool或char数组(例如c类型字符串))并尝试使用指定的参数运行选定的函数。他想知道函数是否使用指定的参数运行,或者它们是否会导致它崩溃(例如因为它们与签名不匹配)。主要问题是C++作为一种强类型语言,要求您在编译时知道函数调用的参数的数量和类型。在我的例子中,我根本不知道这些参数是什么,直到用户在运行时选择它们。我想到的
假设我有一些C++方法返回指向对象的指针。头文件中的内容如下所示:uint8_t*getData(void);这家伙返回一个字节数组,但没有说明这是动态或静态生成的数据片段(类的本地数据或使用new创建的数据)。C++中是否有特定的命名约定来区分返回动态分配的内存(因此必须由请求者删除)的方法与仅返回对静态定义数据片段的引用的方法?执行此操作的首选方法是什么,还是取决于具体情况? 最佳答案 在C++中,您根本不会首先将原始指针分发给客户端。一种可能的解决方案:std::vectorgetData();
在GoogleC++StyleGuide,它说:Whendefiningafunction,parameterorderis:inputs,thenoutputs.Google基本上建议函数参数顺序如下:voidfoo(constFoo&input1,constFoo&input2,Foo*output);不过同事建议把输出放在第一个位置。因为通过这种方式,foo可以接受默认值,并且大多数时候输出不会使用默认值。例如:voidfoo(Foo*output,constFoo&input1,constFoo&input2=default);我觉得他说的很有道理。或者我们在可读性、性能等方面
structPOD{inti,j;};classA{PODm_pod;public:A():m_pod({1,2}){}//errorA():m_pod(static_cast({1,2})){}//errorA():m_pod((POD){1,2}){}//ok!};我在使用g++34编译的旧生产代码中看到了这一点,直到那时我才知道这个特性。是g++吗具体功能?如果不是那么,为什么需要类型转换,而且只允许C风格的类型转换? 最佳答案 实际上,C++标准(C++03和C++11)不允许使用以下语法:A():m_pod((POD){1
风格迁移:一文梳理经典方法发展脉络及原理1.ImageStyleTransferUsingConvolutionalNeuralNetworks:Gram矩阵(CVPR2016)1.1.概述1.2.方法2.DeepPhotoStyleTransfer(CVPR2017)2.1.概述2.2.方法3.UniversalStyleTransferviaFeatureTransform:WCT(whiteningandcoloring)(NIPS2017)3.1.概述3.2.方法4.AClosed-formSolutiontoPhotorealisticImageStylization:PhotoWC
从不使用新删除发布更喜欢使用std::make_uniquestd::unique_ptrstd::move重置(冗余)应该道德上不会导致内存泄漏:new'ed指针只在智能指针内部创建,它们永远无法逃脱,因为我们不允许使用release.因此,人们可能会被诱惑使用这种编码风格,然后再也不会费心检查内存泄漏——无论异常可能从哪里抛出,智能指针的RAII语义应该总是清理任何悬空指针作为堆栈已解开。除了C++充满了令人讨厌的惊喜。根据gotw反复打破我的假设的经验,我不禁认为可能有一些极端情况无论如何都会导致内存泄漏。更糟糕的是,除了release本身,可能还有一种明显的释放指针所有权的方法
在C++中,id喜欢一次将一个字符读入C风格的字符串中。如果不首先创建具有设定大小的字符数组(您不知道用户将输入多少个字符),您将如何做到这一点。既然你不能调整数组的大小,这是怎么做到的?我一直在思考这些问题,但这行不通。charwords[1];intcount=0;charc;while(cin.get(c)){words[count]=c;chartemp[count+1];count++;words=temp;delete[]temp;} 最佳答案 因为您不能使用std::vector,我假设您也不能使用std::strin
我想准备一个老式的参数vector(argv)在函数中使用intexecve(constchar*filename,char*constargv[],char*constenvp[]);我用STL::vector类试过:std::stringarguments=std::string("arg1");std::vectorargv;charargument[128];strcpy(argument,arguments.c_str());argv.push_back(argument);argv.push_back('\0');//finishargvwithzero最后我将vector
我观察到成功完成方法预期功能的一般编码约定是0。(如exit(0))。这种情况让我感到困惑,因为如果我的if语句中有方法并且方法返回0,则“if条件”为假,从而促使我想一想该方法失败了。当然我知道我必须附加一个“!”(如if(!Method())),但这种约定不是自相矛盾吗?? 最佳答案 您需要区分错误代码和错误标志。代码是代表任意数量错误的数字,而标志是指示成功的bool值。当谈到错误代码时,想法是:成功只有一种方法,但失败的方法有很多种。将0作为一个很好的单一唯一数字,代表成功,然后你有每隔一个数字是一种表示失败的方式。(其他任
我是一个相当新的C++程序员,我想听听支持和反对在类声明中命名参数的争论。这是一个例子:Student.h#ifndefSTUDENT_H_#defineSTUDENT_H_#includeusingnamespacestd;classStudent{private:stringname;unsignedintage;floatheight,GPA;public:Student(string,unsignedint,float,float);voidsetAge(unsignedint);};#endif/*STUDENT_H_*/对比#ifndefSTUDENT_H_#defineS